<?php

class AtendimentoController extends Controller {

    /**
     * @final   pacote das views deste controller
     */
    const PACKAGE_VIEW = 'atendimento';
    /**
     * @var AtendimentoService
     */
    private $atendimentoService;
    /**
     * @var MensagemService
     */
    private $mensagemService;
    /**
     * @var ClienteService
     */
    private $clienteService;
    /**
     * @var SetorService
     */
    private $setorService;
    /**
     * @var DepartamentoService
     */
    private $departamentoService;
    /**
     * @var UsuarioService
     */
    private $usuarioService;

    /**
     * __construct
     * Inicializa todos os servicos usuados por AdministracaoController
     */
    public function __construct() {
        $this->atendimentoService = AtendimentoService::getInstance();
        $this->mensagemService = MensagemService::getInstance();
        $this->setorService = SetorService::getInstance();
        $this->clienteService = ClienteService::getInstance();
        $this->departamentoService = DepartamentoService::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
    }

    /**
     * @method  cadastrarChamadoTelefonico
     *
     * Inclui a view de criacao de chamado telefonico. Realiza as buscas de Por todos os setores e clientes.
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function cadastrarChamadoTelefonico() {
        $ArSectors = $this->setorService->findAll(true);
        $ArCustomers = $this->clienteService->findAll(true);
        $this->save(SESSION_INTERFACE, 'SectorsList', $ArSectors);
        $this->save(SESSION_INTERFACE, 'CustomersList', $ArCustomers);
        $this->view('cadastrar_chamado_telefonico', self::PACKAGE_VIEW);
    }

    /**
     * @method  inserirChamadoTelefonico
     *
     * Realiza a criacao do Chamado Telefonico no banco. Fazendo a validacao dos dados
     * previamente.
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2012
     */
    public function inserirChamadoTelefonico()  {
        $ArDados = $_POST;
        foreach($ArDados['PhoneCalled'] as $StField => $StValue) {
            if( !in_array($StField, array()) && empty($StValue) ) {
                $this->saveReturn('O campo "'+ substr($StField, 2) + '" n&atilde;o foi recebido.');
            }
        }

        if( !$this->hasReturn() ) {
            multipleEntities($ArDados);
            if($this->atendimentoService->savePhoneCalled($ArDados)) {
                $this->saveReturn("Chamado Telefônico criado com sucesso", 1);
            } else {
                $this->saveReturn("Erro ao criar o chamado telefônico");
            }
        }

        $this->showJsonResponse();
    }

    /**
     * @method  listarChamadoTelefonico
     *
     * Visualizacao de todos os chamados telefonicos cadastrados no sistema.
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function listarChamadoTelefonico() {
        $this->save(SESSION_INTERFACE, 'CalledList', $this->atendimentoService->findPhoneCalledsBySector());

        $this->view('visualizar_chamado_telefonico', self::PACKAGE_VIEW);
    }

    /**
     * @method  filter
     * @access  ajax
     *
     * Acessado via ajax, realiza filtros dos chamados telefonicos e externos cadastrados
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function filter() {
        $filterType = treatUrl('type');
        $IDFilter = $_POST['filterkey'];
        multipleEntities($IDFilter);
        $this->save(SESSION_INTERFACE, 'CalledList', $this->atendimentoService->findCalledByFilter($IDFilter, $filterType));

        if($filterType == 'phone') {
            $this->view('phonecalledtablelist', self::PACKAGE_VIEW, true);
        } else if($filterType == 'external') {
            $this->view('externalcalledtablelist', self::PACKAGE_VIEW, true);
        } else if($filterType == 'internal') {
            $this->view('internalcalledtablelist', self::PACKAGE_VIEW, true);
        } else if($filterType == 'cancelled') {
            $this->view('cancelledcalledtablelist', self::PACKAGE_VIEW, true);
        }
    }

    public function dateFilter() {
        $filterType = treatUrl('type');
        $ArParams = $_POST;
        multipleEntities($ArParams);

        $this->save(SESSION_INTERFACE, 'Report', $this->atendimentoService->generateReportByFilter($filterType, $ArParams));

        if( $filterType == 'individualReport' ) {
            $this->view('individual_report', self::PACKAGE_VIEW, true);
        } else if( $filterType == 'pessoalReport' ) {
            $this->view('user_report', 'usuario', true);
        } elseif ( $filterType == 'sectorReport' ) {
            $this->view('sector_report', self::PACKAGE_VIEW, true);
        } elseif ( $filterType == 'departamentReport' ) {
            $this->view('departament_report', self::PACKAGE_VIEW, true);
        }
    }

    //20-06
    public function buscarChamado() {
        $StFeedback = treatUrl('feedback');
        $ArSectors = $this->setorService->findAll();
        $this->save(SESSION_INTERFACE, 'SectorsList', $ArSectors);
        if( !empty($StFeedback) ) {
            $StMessage = $StFeedback == 'chamado-nao-encontrado' ? 'A busca não retornou nenhum resultado.' : 'Parâmetros não foram passados corretamente.';
            $this->addFeedback($StMessage);
        }
        $this->view('buscar_chamado', self::PACKAGE_VIEW);
    }

    public function resultadoBusca() {
        multipleEntities($_POST);

        if( empty($_POST['FilterType']) ) {
            return redirect('atendimento','buscar-chamado', 'feedback/parametros-invalidos');
        }

        $ArDados = $this->atendimentoService->generateSearchParameters($_POST);
        $ArSearch = $this->atendimentoService->searchCalledByFilter($ArDados);
        
        if( empty($ArSearch) ) {
            return redirect('atendimento','buscar-chamado', 'feedback/chamado-nao-encontrado');
        }

        $this->save(SESSION_INTERFACE, 'SearchResult', $ArSearch);
        $this->view('resultado_busca', self::PACKAGE_VIEW);
    }

    //julho
    public function listarChamadoExterno() {
        $this->save(SESSION_INTERFACE, 'CalledList', $this->atendimentoService->findAllExternalCalledSector());
        $this->view('listar_chamado_externo', self::PACKAGE_VIEW);
    }

    public function visualizarChamado() {
        $IDChamado = treatUrl('id');
        multipleEntities($IDChamado);

        $Chamado = $this->atendimentoService->findById($IDChamado);

        if( empty($Chamado) ) {
            redirect('atendimento', 'buscar-chamado');
        }

        $this->save(SESSION_INTERFACE, 'Called', $Chamado);
        $this->save(SESSION_INTERFACE, 'DepartamentList', $this->departamentoService->findAll());
        $this->save(SESSION_INTERFACE, 'UserList', $this->usuarioService->findAll(true));

        $StViewName = $this->getViewToVisualizarChamadoByType($Chamado);
        $this->view($StViewName, self::PACKAGE_VIEW);
    }

    private function getViewToVisualizarChamadoByType($Chamado) {
        $ArViews = array(
            Chamado::PHONE_CALLED => 'chamadotelefonico',
            Chamado::EXTERNAL_CALLED => 'chamadoexterno',
            Chamado::INTERNAL_CALLED => 'chamadointerno',
            Chamado::CANCELLED_CALLED => 'chamadocancelamento'
        );
        return !$Chamado->isClosed() ? $ArViews[$Chamado->getEnTipoChamado()] : 'chamadofechado';
    }

    public function prioridade() {
        $ArDados = $_POST;
        multipleEntities($ArDados);

        if( empty($ArDados['IDChamado']) ) {
            $this->saveReturn('O Campo "IDChamado" não foi enviado!');
        } else if( empty($ArDados['EnPrioridade']) ) {
            $this->saveReturn('O Campo "EnPrioridade" não foi enviado!');
        }

        if( !$this->hasReturn() && !Dracosys::getLoggedUser()->can('Marcar/Desmarcar Chamado Prioridade') ) {
            $this->saveReturn('Você não pode marcar ou desmarcar este chamado como prioridade');
        }
        if( !$this->hasReturn() ) {
            if( $this->atendimentoService->updateCalled($ArDados) ) {
                $this->saveReturn('Chamado atualizado com sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao atualizar o chamado!');
            }
        }

        $this->showJsonResponse();
    }

    public function responder() {
        $ArDados = $_POST;
        multipleEntities($ArDados);

        if( empty($ArDados['TxObservacao']) && empty($ArDados['TxResposta']) ) {
            $this->saveReturn('Nenhuma mensagem foi recuperada para inser&ccedil;&atilde;o.');
        } else if( empty($ArDados['IDChamado']) ) {
            $this->saveReturn('Erro ao enviar identifica&ccedil;&atilde;o do chamado.');
        }

        $Chamado = $this->atendimentoService->findById($ArDados['IDChamado']);
        if( !empty($ArDados['TxResposta']) && !Dracosys::getLoggedUser()->can('Responder Chamados de outro setor') && !$Chamado->isFromLoggedUserSector() ) {
            $this->saveReturn('Você não tem permissão para responder chamados de outros setores!');
        }

        if( !$this->hasReturn() ){
            if( !empty($ArDados['TxObservacao']) ) {
                $BoRetornoNote = $this->atendimentoService->insertNote($ArDados);
            }
            if( !empty($ArDados['TxResposta']) ) {
                $BoRetornoAnswer = $this->atendimentoService->insertAnswer($ArDados);
            }
            $ArMessages = array();
            $ItType = 1;
            if( isset($BoRetornoNote) && $BoRetornoNote == true ) {
                $ArMessages[] = 'Observação adicionada com sucesso.';
            } else if (isset($BoRetornoNote) && $BoRetornoNote == false) {
                $ArMessages[] = 'Ocorreu um erro ao inserir a Observação.';
                $ItType = 0;
            }
            if( isset($BoRetornoAnswer) && $BoRetornoAnswer == true ) {
                $ArMessages[] = 'Resposta Inserida com sucesso.';
            } else if( isset($BoRetornoAnswer) && $BoRetornoAnswer == false ) {
                $ArMessages[] = 'Ocorreu um erro ao inserir a Resposta.';
                $ItType = 0;
            }
            $this->saveReturn(implode(' ', $ArMessages),$ItType);
        }

        $this->showJsonResponse();
    }

    public function trocarChamadoSetor() {
        $ArDados = $_POST;

        if( empty($ArDados['IDChamado']) ) {
            $this->saveReturn('O Campo IDChamado não foi recebido.');
        } else if( empty($ArDados['IDNewSector']) ) {
            $this->saveReturn('O Novo setor não foi enviado');
        } else if( empty($ArDados['IDOldSector']) ) {
            $this->saveReturn('O Antigo Setor nao foi recebido');
        } else if( $ArDados['IDOldSector'] == $ArDados['IDNewSector'] ) {
            $this->saveReturn('Selecione um novo Departamento ou Setor para efetuar a troca.');
        }

        if( !$this->hasReturn() && !Dracosys::getLoggedUser()->can('Trocar Chamado de Setor') ) {
            $this->saveReturn('Seu usu&aacute;rio não possui privilégios para trocar este chamado de Setor');
        }

        if( !$this->hasReturn() && $this->atendimentoService->changeSector($ArDados) ) {
            $this->saveReturn('Setor trocado com sucesso.', 1);
        } else {
            $this->saveReturn('Ocorreu um erro ao trocar o setor.');
        }

        $this->showJsonResponse();
    }

    public function trocarResponsavelChamado() {
        $ArDados = $_POST;
        multipleEntities($ArDados);

        if( empty($ArDados['IDNewUser']) ) {
            $this->saveReturn('Nenhuma mensagem foi recuperada para inser&ccedil;&atilde;o.');
        }

        if( !$this->hasReturn() ) {
            if( $this->atendimentoService->changeResponsible($ArDados) ) {
                $this->saveReturn('Responsável do Chamado alterado com sucesso.', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao alterar o responsável do chamado.');
            }
        }

        $this->showJsonResponse();
    }

    public function listarChamadoInterno() {
        $this->save(SESSION_INTERFACE, 'CalledList', $this->atendimentoService->findInternalCalledBySector());
        $this->view('listar_chamado_interno', self::PACKAGE_VIEW);
    }

    public function relatorioIndividual() {
        $this->save(SESSION_INTERFACE, 'Report', $this->atendimentoService->generateIndividualReport());

        $this->view('relatorio_individual', self::PACKAGE_VIEW);
    }

    public function cadastrarChamadoInterno() {
        $this->save(SESSION_INTERFACE, 'SectorList', $this->setorService->findAll(true));
        $this->view('cadastrar_chamado_interno', self::PACKAGE_VIEW);
    }

    public function inserirChamadoInterno() {
        $ArDados = $_POST;
        multipleEntities($ArDados);

        if( empty($ArDados['StTitulo']) ) {
            $this->saveReturn('O Campo "Título" não foi enviado.');
        } else if( empty($ArDados['IDSetor']) ) {
            $this->saveReturn('O Campo "Setor" não foi enviado.');
        } else if( empty($ArDados['EnPrioridade']) ) {
            $this->saveReturn('O Campo "Prioridade" não foi marcado.');
        } else if( empty($ArDados['TxMensagem']) ) {
            $this->saveReturn('O Campo "Mensagem" não foi enviado.');
        }

        if( !$this->hasReturn() ) {
            if( $this->atendimentoService->saveInternalCalled($ArDados) ) {
                $this->saveReturn('Chamado Interno criado com sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao criar o Chamado Interno');
            }
        }

        $this->showJsonResponse();
    }

    public function relatorioPorSetor() {
        $this->save(SESSION_INTERFACE, 'Report', $this->atendimentoService->generateSectorReport());
        $this->view('relatorio_setor', self::PACKAGE_VIEW);
    }

    public function relatorioPorDepartamento() {
        $this->save(SESSION_INTERFACE, 'Report', $this->atendimentoService->generateDepartamentReport());
        $this->view('relatorio_departamento', self::PACKAGE_VIEW);
    }

    public function fecharChamado(){
        $ArDados = $_POST;
        multipleEntities($ArDados);

        if( empty($ArDados['IDChamado'])){
            $this-saveReturn('O par�metro IDChamado n�o foi passado.');
        }

//        if(!$this->hasReturn()){
//            if($this->atendimentoService->closeCalled($ArDados['IDChamado'])){
//
//            } else {
//
//            }
//        }

        if(!$this->hasReturn() && $this->atendimentoService->closeCalled($ArDados['IDChamado'])){
            $this->saveReturn('Chamado fechado com sucesso', 1);
        } else {
            $this->saveReturn('Ocorreu um erro ao salvar o chamado');
        }

        $this->showJsonResponse();
    }

    public function adicionarAosFavoritos() {
        $IDChamado = $_POST['IDChamado'];
        multipleEntities($IDChamado);

        if( empty($IDChamado) ) {
            $this->saveReturn('O identificador do chamado não foi recebido');
        }

        if( !$this->hasReturn() ) {
            if( $this->atendimentoService->addToFavourite($IDChamado) ) {
                $this->saveReturn('Chamado adicionado aos favoritos com sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao adicionar este chamado aos Favoritos!');
            }
        }

        $this->showJsonResponse();
    }

    public function removerDosFavoritos() {
        $IDChamado = $_POST['IDChamado'];
        multipleEntities($IDChamado);

        if( empty($IDChamado) ) {
            $this->saveReturn('O identificador do chamado não foi recebido');
        }

        if( !$this->hasReturn() ) {
            if( $this->atendimentoService->removeFromFavourite($IDChamado) ) {
                $this->saveReturn('Chamado adicionado aos favoritos com sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao adicionar este chamado aos Favoritos!');
            }
        }

        $this->showJsonResponse();
    }

    public function lendoChamado() {
        $ArDados = $_POST;

        $BoLendo = $this->atendimentoService->isReading($ArDados['IDChamado']);
        $StMessage = $BoLendo ? 'Atenção: Este Chamado já está sendo analisado por outro usuário.' : 'Chamado não está sendo analisado';
        $this->atendimentoService->readingCalled($ArDados['IDChamado']);

        $this->saveReturn($StMessage, 1);
        $this->showJsonResponse();
    }

    public function naoLendoChamado() {
        $ArDados = $_POST;

        $this->atendimentoService->notReadingCalled($ArDados['IDChamado']);
    }

}
?>
